2022년 11월 26일
열심히 개발환경을 셋팅하고, 열심히 일하고, 열심히 퇴근했습니다. 그런데 마침 좋은 코드가 생각나서 집에서 코드를 수정해보려 합니다.
그런데 생각해보니 집에서는 회사와 같이 개발환경을 셋팅하지 않았네요. 문득 여러가지 생각이 듭니다. 귀찮기도 하고, 내일할까 싶기도 하고.. 아니 애초에 좀 간단하게 개발환경 셋팅하면 안되나..
이런 고민을 해결하기 위해 여러 방법을 찾던 중 도커에 대해 알게됩니다. 도커가 소프트웨어를 패키징해 쉽고 빠르게 배포를 도와준다고 합니다.
무슨말인지 잘 모르겠으니 상세하게 찾아보겠습니다.
자, 도커는 2013년 출시된 컨테이너 기반의 오픈소스 가상화 플랫폼입니다.
이 도커를 사용하면 개발자는 쉽고 빠르게 여러 어플리케이션을 구축할수 있습니다. 그런데 컨테이너 기반이라고 한다면 컨테이너는 뭐고 가상화는 뭘까요?
컨테이너는 호스트OS (기본적으로 설치되어있는 운영체제) 상에 논리적인 구획(컨테이너)를 만들고, 어플리케이션을 작동시키기 위해 필요한 라이브러리나 여러 패키지들을 하나로 모아 마치 별도의 서버인것처럼 사용할수 있게 만든것입니다. 물론 도커를 사용하지 않고도 컨테이너를 사용할수 있긴 합니다.
가상화란 물리적인 하드웨어 장치를 논리적인 객체로 추상화하는 기술을 의미한다고 합니다. 일반적으로 우리는 하나의 OS위에서 어플리케이션이 실행됩니다. 하지만 가상화를 이용하면 기본 하드웨어의 자산인 CPU,MEMORY,Network등을 분산하거나 합쳐서 더 효율적으로 사용할수 있다고 합니다.
사실 도커이전에도 이러한 고민은 많았었고, 해결책중 하나가 바로 가상화롤 통한 VM이었습니다.
가상머신은 우리 컴퓨터의 호스트OS위에 Hyperviso같은 가상머신을 관리하는 별도의 소프트웨어를 통해 가상의 하드웨어 위에 새로운 게스트OS를 설치하여 사용하는 기술입니다. 이런 가상머신은 윈도우에서 우분투를 돌리거나 할때 사용하기도 했습니다.
잠깐 알아보았지만, 이전 문제를 해결하기 위한 방법으로 VM도 있었고, 그 이후에 컨테이너라는 기술도 생겼습니다. 그런데 왜 다들 도커에 열광하는걸까요?
이전에 있었던 기술의 문제점은 무엇인지, 도커는 이를 어떻게 해결했는지 잠깐 알아보겠습니다.
가상머신은 또하나의 OS를 설치하는 것입니다. 만약 100MB의 게스트OS를 10개 설치한다면? 그 메모리만 해도 벌써 많은 양을 차지하고 있습니다. 또한 가상화는 하드웨어 자원들을 쪼개거나 합친다고 했습니다. 그렇다면 CPU또한 나눠서 사용되어야 하고, 이로 인해 CPU자원을 확보하는것 또한 쉽지 않을것입니다.
컨테이너를 직접 만들수 있습니다. 다만 해당 개념에대한 깊은 이해도가 필요하며, 이를 유지하고 관리하는것은 또 별개로 힘든 작업이 될것입니다. 애초에 도커는 LXC(리눅스 컨테이너)를 기반으로한 상위레벨의 컨테이너 기술입니다. 도커를 사용하는것은 어찌보면 더 쉽고 빠른 선택지인것이 당연합니다.
우리는 ‘다양한 환경의 어플리케이션’을 개발하기 위한 방법으로 가상머신을 사용할 수 있었고, 그보다 더 빠르고 가벼운 컨테이너라는 기술을 알게 되었습니다.
그리고 그 컨테이너를 기반으로 만들어진 도커는 이러한 컨테이너 기술을 개발자들이 더 쉽게 사용하고, 유지보수 할 수 있게 도와주는 소프트웨어 플랫폼입니다.
자 정말 간단하게 도커에 대해 알아보았습니다. 물론 더 깊게 알기위해서는 컨테이너에 대한 깊은 이해도와 더불어 운영체제에 대한 이해도 필요할 것 입니다.
하지만 그 부분은 추후에 채우도록하고, 이제 도커를 직접 사용해 봅시다.
참고로 저는 WSL2를 이용하여 Ubuntu20.04.5 버전을 이용했습니다.
여러가지 설치 방법중 스크립트를 이용한 설치를 진행해 보겠습니다.
$ curl -fsSL https://get.docker.com/ | sudo sh
해당 명령어를 입력해주시고 좀 기다려 주시면 도커의 설치가 완료됩니다.
도커의 버전을 확인하며 제대로 설치되었는지 체크해줍니다.
$ sudo docker version
...
Client: Docker Engine - Community
Version: 20.10.21
자 그런데 이번에 깜빡하고 sudo를 붙이지 않고 명령어를 입력했더니..
Got permission denied while trying to connect to the Docker daemon socket...
위와 같은 에러가 출력됩니다.
읽어보니 권한이 없어 거부되었고, 도커데몬에 연결해보라는 해결책을 줍니다.
그렇습니다. 루트계정이 아니기때문에 도커서비스 접속에 권한이 없는것입니다. 해당문제는 루트계정으로 접속하거나 해당계정을 도커그룹에 추가해주시는 것으로 해결이 가능합니다.
$ sudo usermod -aG docker ${USER}
// $USER은 유저 이름이 들어있는 변수입니다.
// 해당 변수와 계정의 이름이 맞는지 확인해줍시다.
이후 추가된것을 확인하고 도커를 새로 시작해주면 sudo없이도 도커서비스에 접근이 가능한것을 확인해볼수 있습니다.
그럼 이제 이미지도 확인해줍시다.
$ docker image
REPOSITORY TAG IMAGE ID CREATED SIZE
// 현재 설치된 이미지가 없습니다.
도커에는 중요한 개념 이미지와 컨테이너가 있습니다. 컨테이너는 위와 같은 개념이며, 이미지는 어플리케이션 실행에 필요한 다양한 파일들을 모아 도커파일을 통해 이미지를 빌드합니다. 그리고 해당 이미지를 실행하여 도커 컨테이너를 사용할 수 있게 됩니다.
자 그럼 이제 새로운 이미지를 받아봅시다.
$ docker pull centos
...이후 다시 이미지를 확인하면
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 14 months ago 231MB
centOS의 이미지가 받아졌습니다. 즉 해당 이미지를 실행하면 centOS의 환경을 실행할수 있는 것입니다.
자 이렇게 간단히 도커란 무엇인지와 도커를 설치해보고 이미지를 받아보는것까지 했습니다. 사실 이제 이미지를 실행시켜 컨테이너를 띄우면 아주아주 기본적인 도커실행은 끝이긴 합니다.
다만 개요에도 나왔듯, 제 목적은 개발환경의 통합입니다. 그렇다면 우선 해야할 것은 나의 개발환경을 도커파일을 통해 이미지로 빌드하는 것 입니다.
사실 커맨드로 설치하지 않아도 공식 홈페이지에 가면 아주아주 쉽게 다운로드가 가능합니다.
그렇기에 다음에 직접 이미지를 빌드시켜보고, 해당 이미지를 다른 컴퓨터에서 빌드해서 잘 작동되는지 확인해보겠습니다.